package com.cyan.app.workflow.customview;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.DatePicker;
import android.widget.DatePicker.OnDateChangedListener;
import com.cyan.app.workflow.R;
import java.lang.reflect.Field;

/**
 * Created by DXW on 2016-03-30.
 */
public class DatePickerDialog extends AlertDialog implements OnClickListener, OnDateChangedListener {
    private static final String START_YEAR = "start_year";
       private static final String START_MONTH = "start_month";
       private static final String START_DAY = "start_day";
       private final DatePicker mDatePicker_start;
       private final OnDateSetListener mCallBack;
    public interface OnDateSetListener {
        void onDateSet(DatePicker startDatePicker, int startYear, int startMonthOfYear, int startDayOfMonth);
    }
    public DatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) {
             this(context, 0, callBack, year, monthOfYear, dayOfMonth);
         }

    public DatePickerDialog(Context context, int theme, OnDateSetListener callBack, int year, int monthOfYear,int dayOfMonth) {
             this(context, 0, callBack, year, monthOfYear, dayOfMonth, true);
         }
    public DatePickerDialog(Context context, int theme, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth, boolean isDayVisible) {
          super(context, theme);

          mCallBack = callBack;

          Context themeContext = getContext();
          setButton(BUTTON_POSITIVE, "确 定", this);
          setButton(BUTTON_NEGATIVE, "取 消", this);
          // setButton(BUTTON_POSITIVE,
          // themeContext.getText(android.R.string.date_time_done), this);
          setIcon(0);

          LayoutInflater inflater = (LayoutInflater) themeContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          View view = inflater.inflate(R.layout.date_picker_dialog, null);
          setView(view);
          mDatePicker_start = (DatePicker) view.findViewById(R.id.datePickerStart);
          //mDatePicker_start.setCalendarViewShown(true);
          mDatePicker_start.init(year, monthOfYear, dayOfMonth, this);
          // updateTitle(year, monthOfYear, dayOfMonth);

          // 如果要隐藏当前日期，则使用下面方法。
          if (!isDayVisible) {
                  hidDay(mDatePicker_start);
              }
            }


    private void hidDay(DatePicker mDatePicker) {
         Field[] datePickerfFields = mDatePicker.getClass().getDeclaredFields();
         for (Field datePickerField : datePickerfFields) {
                 if ("mDaySpinner".equals(datePickerField.getName())) {
                         datePickerField.setAccessible(true);
                         Object dayPicker = new Object();
                         try {
                   dayPicker = datePickerField.get(mDatePicker);
                          } catch (IllegalAccessException e) {
                              e.printStackTrace();
                          } catch (IllegalArgumentException e) {
                              e.printStackTrace();
                          }
                      // datePicker.getCalendarView().setVisibility(View.GONE);
                      ((View) dayPicker).setVisibility(View.GONE);
                  }
          }
        }

            public void onClick(DialogInterface dialog, int which) {
            // Log.d(this.getClass().getSimpleName(), String.format("which:%d",
            // which));
            // 如果是“取 消”按钮，则返回，如果是“确 定”按钮，则往下执行
            if (which == BUTTON_POSITIVE)
                    tryNotifyDateSet();
        }

            @Override
         public void onDateChanged(DatePicker view, int year, int month, int day) {
             if (view.getId() == R.id.datePickerStart)
                     mDatePicker_start.init(year, month, day, this);
             // updateTitle(year, month, day);
         }

    /**
       * 获得开始日期的DatePicker
       *
       * @return The calendar view.
       */
       public DatePicker getDatePickerStart() {
              return mDatePicker_start;
          }


       /**
       * Sets the start date.
       *
       * @param year
       *            The date year.
       * @param monthOfYear
       *            The date month.
       * @param dayOfMonth
       *            The date day of month.
       */
      public void updateStartDate(int year, int monthOfYear, int dayOfMonth) {
             mDatePicker_start.updateDate(year, monthOfYear, dayOfMonth);
         }
       private void tryNotifyDateSet() {
         if (mCallBack != null) {
                 mDatePicker_start.clearFocus();
                 mCallBack.onDateSet(mDatePicker_start, mDatePicker_start.getYear(), mDatePicker_start.getMonth(),mDatePicker_start.getDayOfMonth());
                  }
        }

       @Override
       protected void onStop() {
           // tryNotifyDateSet();
           super.onStop();
       }
        @Override
        public Bundle onSaveInstanceState() {
              Bundle state = super.onSaveInstanceState();
              state.putInt(START_YEAR, mDatePicker_start.getYear());
              state.putInt(START_MONTH, mDatePicker_start.getMonth());
              state.putInt(START_DAY, mDatePicker_start.getDayOfMonth());
              return state;
          }
       @Override
       public void onRestoreInstanceState(Bundle savedInstanceState) {
           super.onRestoreInstanceState(savedInstanceState);
               int start_year = savedInstanceState.getInt(START_YEAR);
               int start_month = savedInstanceState.getInt(START_MONTH);
               int start_day = savedInstanceState.getInt(START_DAY);
               mDatePicker_start.init(start_year, start_month, start_day, this);
           }
}
